/**
 *  参数：
container：这是一个 DOM 容器，可以是 Element（如 <div>）、Document 或 DocumentFragment。这个容器将用于挂载 React 应用。
options（可选）：一个配置对象，用于指定一些高级选项，如严格模式、错误处理回调等。
返回值：返回一个 RootType 类型的对象，即 ReactDOMRoot 的实例。
isValidContainer 检查传入的 container 是否是一个有效的 DOM 容器。如果无效，则抛出错误。
warnIfReactDOMContainerInDEV 在开发环境（__DEV__）中，调用 warnIfReactDOMContainerInDEV 函数，可能用于检查是否存在某些不符合规范的用法，并发出警告。
concurrentUpdatesByDefaultOverride：是否默认启用并发更新（默认为 false）。
isStrictMode：是否启用严格模式（默认为 false）。
identifierPrefix：用于生成唯一标识符的前缀（默认为空字符串）。
onUncaughtError、onCaughtError、onRecoverableError：错误处理回调函数，分别用于处理未捕获错误、捕获错误和可恢复错误。
transitionCallbacks：与过渡（transition）相关的回调函数。
 */

export function createRoot(
  container: Element | Document | DocumentFragment,
  options?: CreateRootOptions,
): RootType {
  if (!isValidContainer(container)) {
    throw new Error('Target container is not a DOM element.');
  }

  warnIfReactDOMContainerInDEV(container);

  const concurrentUpdatesByDefaultOverride = false;
  let isStrictMode = false;
  let identifierPrefix = '';
  let onUncaughtError = defaultOnUncaughtError;
  let onCaughtError = defaultOnCaughtError;
  let onRecoverableError = defaultOnRecoverableError;
  let transitionCallbacks = null;

  if (options !== null && options !== undefined) {
    if (__DEV__) {
      if ((options: any).hydrate) {
        console.warn(
          'hydrate through createRoot is deprecated. Use ReactDOMClient.hydrateRoot(container, <App />) instead.',
        );
      } else {
        if (
          typeof options === 'object' &&
          options !== null &&
          (options: any).$$typeof === REACT_ELEMENT_TYPE
          ) {
          console.error(
            'You passed a JSX element to createRoot. You probably meant to ' +
            'call root.render instead. ' +
            'Example usage:\n\n' +
            '  let root = createRoot(domContainer);\n' +
            '  root.render(<App />);',
          );
        }
      }
    }
    if (options.unstable_strictMode === true) {
      isStrictMode = true;
    }
    if (options.identifierPrefix !== undefined) {
      identifierPrefix = options.identifierPrefix;
    }
    if (options.onUncaughtError !== undefined) {
      onUncaughtError = options.onUncaughtError;
    }
    if (options.onCaughtError !== undefined) {
      onCaughtError = options.onCaughtError;
    }
    if (options.onRecoverableError !== undefined) {
      onRecoverableError = options.onRecoverableError;
    }
    if (options.unstable_transitionCallbacks !== undefined) {
      transitionCallbacks = options.unstable_transitionCallbacks;
    }
  }

  const root = createContainer(
    container,
    ConcurrentRoot,
    null,
    isStrictMode,
    concurrentUpdatesByDefaultOverride,
    identifierPrefix,
    onUncaughtError,
    onCaughtError,
    onRecoverableError,
    transitionCallbacks,
  );
  markContainerAsRoot(root.current, container);

  const rootContainerElement: Document | Element | DocumentFragment =
    container.nodeType === COMMENT_NODE
      ? (container.parentNode: any)
        : container;
  listenToAllSupportedEvents(rootContainerElement);

  // $FlowFixMe[invalid-constructor] Flow no longer supports calling new on functions
  return new ReactDOMRoot(root);
}